import ArrayList from '@ohos.util.ArrayList'

/**
 * 回调方法
 */
export interface Observe<T> {
  (data: T): void
}

export class LiveData<T> {
  //数据
  private value: T

  constructor(value?: T) {
    this.value = value
  }

  /**
   * 保存方法回调
   */
  private observers = new ArrayList<Observe<T>>()

  /**
   * 添加观察回调
   * @param obs
   */
  observe(obs: Observe<T>) {
    this.observers.add(obs)
  }

  /**
   * 更新数据
   * @param value
   */
  setValue(value: T) {
    this.value = value
    this.observers.forEach((obs) => {
      obs(this.value)
    })
  }

  /**
   * 更新数据
   * @param value
   */
  async postValue(value: Promise<T>) {
    this.value = await value
    this.observers.forEach(async (obs) => {
      obs(this.value)
    })
  }

  /**
   * 注销监听
   */
  clear() {
    this.observers.clear()
  }
}